// Copyright (c) Meta Platforms, Inc. and affiliates.

#ifndef ZSTRONG_ZS2_SELECTOR_DECLARE_HELPER_MACRO_UTILS_H
#define ZSTRONG_ZS2_SELECTOR_DECLARE_HELPER_MACRO_UTILS_H

/* Based on
 * https://stackoverflow.com/questions/11761703/overloading-macro-on-number-of-arguments
 */

#define _ZS2__NARG__(...) _ZS2__NARG_I_(__VA_ARGS__, _ZS2__RSEQ_N() - 1)
#define _ZS2__NARG_I_(...) _ZS2__ARG_N(__VA_ARGS__)
// clang-format off
#define _ZS2__ARG_N( \
      _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \
     _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \
     _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \
     _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \
     _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \
     _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \
     _61,_62,_63,N,...) N
#define _ZS2__RSEQ_N() \
     63,62,61,60,                   \
     59,58,57,56,55,54,53,52,51,50, \
     49,48,47,46,45,44,43,42,41,40, \
     39,38,37,36,35,34,33,32,31,30, \
     29,28,27,26,25,24,23,22,21,20, \
     19,18,17,16,15,14,13,12,11,10, \
     9,8,7,6,5,4,3,2,1,0
// clang-format on

/* general definition for any function name */
#define _ZS2___VFUNC(name, n) name##n
#define _ZS2__VFUNC(name, n) _ZS2___VFUNC(name, n)
#define _ZS2_VFUNC(func, ...) \
    _ZS2__VFUNC(func, _ZS2__NARG__(__VA_ARGS__))(__VA_ARGS__)
#define _ZS2_VFUNC2(func, ...) \
    _ZS2__VFUNC(func, _ZS2__NARG__(__VA_ARGS__))(__VA_ARGS__)

// clang-format off
/*
Created with:
print("\n".join(f"#define _ZS2_TRIM_EDGES_I{i}({', '.join([f'_{x}' for x in range(1, i+1) ])})  {', '.join([f'_{x}' for x in range(2, i) ])}" for i in range(60)))

Then _ZS2_TRIM_EDGES_I2(_1, _2) set to void to handle empty argument list.
*/

#define _ZS2_TRIM_EDGES_I2(_1, _2) void
#define _ZS2_TRIM_EDGES_I3(_1, _2, _3)  _2
#define _ZS2_TRIM_EDGES_I4(_1, _2, _3, _4)  _2, _3
#define _ZS2_TRIM_EDGES_I5(_1, _2, _3, _4, _5)  _2, _3, _4
#define _ZS2_TRIM_EDGES_I6(_1, _2, _3, _4, _5, _6)  _2, _3, _4, _5
#define _ZS2_TRIM_EDGES_I7(_1, _2, _3, _4, _5, _6, _7)  _2, _3, _4, _5, _6
#define _ZS2_TRIM_EDGES_I8(_1, _2, _3, _4, _5, _6, _7, _8)  _2, _3, _4, _5, _6, _7
#define _ZS2_TRIM_EDGES_I9(_1, _2, _3, _4, _5, _6, _7, _8, _9)  _2, _3, _4, _5, _6, _7, _8
#define _ZS2_TRIM_EDGES_I10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10)  _2, _3, _4, _5, _6, _7, _8, _9
#define _ZS2_TRIM_EDGES_I11(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11)  _2, _3, _4, _5, _6, _7, _8, _9, _10
#define _ZS2_TRIM_EDGES_I12(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11
#define _ZS2_TRIM_EDGES_I13(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12
#define _ZS2_TRIM_EDGES_I14(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13
#define _ZS2_TRIM_EDGES_I15(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14
#define _ZS2_TRIM_EDGES_I16(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15
#define _ZS2_TRIM_EDGES_I17(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16
#define _ZS2_TRIM_EDGES_I18(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17
#define _ZS2_TRIM_EDGES_I19(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18
#define _ZS2_TRIM_EDGES_I20(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19
#define _ZS2_TRIM_EDGES_I21(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20
#define _ZS2_TRIM_EDGES_I22(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21
#define _ZS2_TRIM_EDGES_I23(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22
#define _ZS2_TRIM_EDGES_I24(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23
#define _ZS2_TRIM_EDGES_I25(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24
#define _ZS2_TRIM_EDGES_I26(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25
#define _ZS2_TRIM_EDGES_I27(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26
#define _ZS2_TRIM_EDGES_I28(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27
#define _ZS2_TRIM_EDGES_I29(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28
#define _ZS2_TRIM_EDGES_I30(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29
#define _ZS2_TRIM_EDGES_I31(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30
#define _ZS2_TRIM_EDGES_I32(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31
#define _ZS2_TRIM_EDGES_I33(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32
#define _ZS2_TRIM_EDGES_I34(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33
#define _ZS2_TRIM_EDGES_I35(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34
#define _ZS2_TRIM_EDGES_I36(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35
#define _ZS2_TRIM_EDGES_I37(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36
#define _ZS2_TRIM_EDGES_I38(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37
#define _ZS2_TRIM_EDGES_I39(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38
#define _ZS2_TRIM_EDGES_I40(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39
#define _ZS2_TRIM_EDGES_I41(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40
#define _ZS2_TRIM_EDGES_I42(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41
#define _ZS2_TRIM_EDGES_I43(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42
#define _ZS2_TRIM_EDGES_I44(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43
#define _ZS2_TRIM_EDGES_I45(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44
#define _ZS2_TRIM_EDGES_I46(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45
#define _ZS2_TRIM_EDGES_I47(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46
#define _ZS2_TRIM_EDGES_I48(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47
#define _ZS2_TRIM_EDGES_I49(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48
#define _ZS2_TRIM_EDGES_I50(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49
#define _ZS2_TRIM_EDGES_I51(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50
#define _ZS2_TRIM_EDGES_I52(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51
#define _ZS2_TRIM_EDGES_I53(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52
#define _ZS2_TRIM_EDGES_I54(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53
#define _ZS2_TRIM_EDGES_I55(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54
#define _ZS2_TRIM_EDGES_I56(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55
#define _ZS2_TRIM_EDGES_I57(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56
#define _ZS2_TRIM_EDGES_I58(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57
#define _ZS2_TRIM_EDGES_I59(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59)  _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58
#define _ZS2_TRIM_EDGES(...) _ZS2_VFUNC2(_ZS2_TRIM_EDGES_I, __VA_ARGS__)
#define _ZS2_TRIM_COMMA(...) _ZS2_TRIM_EDGES(START, __VA_ARGS__ END)

/*
Created with:
print("\n".join(f"#define _ZS2_ATTACH_PREFIX_I{i+1}(PREFIX, {', '.join([f'_{x}' for x in range(1, i+1) ])})  {' '.join([f'PREFIX##_{x}' for x in range(1, i+1) ])}" for i in range(60)))
*/

#define _ZS2_ATTACH_PREFIX_I2(PREFIX, _1)  PREFIX##_1
#define _ZS2_ATTACH_PREFIX_I3(PREFIX, _1, _2)  PREFIX##_1 PREFIX##_2
#define _ZS2_ATTACH_PREFIX_I4(PREFIX, _1, _2, _3)  PREFIX##_1 PREFIX##_2 PREFIX##_3
#define _ZS2_ATTACH_PREFIX_I5(PREFIX, _1, _2, _3, _4)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4
#define _ZS2_ATTACH_PREFIX_I6(PREFIX, _1, _2, _3, _4, _5)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5
#define _ZS2_ATTACH_PREFIX_I7(PREFIX, _1, _2, _3, _4, _5, _6)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6
#define _ZS2_ATTACH_PREFIX_I8(PREFIX, _1, _2, _3, _4, _5, _6, _7)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7
#define _ZS2_ATTACH_PREFIX_I9(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8
#define _ZS2_ATTACH_PREFIX_I10(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9
#define _ZS2_ATTACH_PREFIX_I11(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10
#define _ZS2_ATTACH_PREFIX_I12(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11
#define _ZS2_ATTACH_PREFIX_I13(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12
#define _ZS2_ATTACH_PREFIX_I14(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13
#define _ZS2_ATTACH_PREFIX_I15(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14
#define _ZS2_ATTACH_PREFIX_I16(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15
#define _ZS2_ATTACH_PREFIX_I17(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16
#define _ZS2_ATTACH_PREFIX_I18(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17
#define _ZS2_ATTACH_PREFIX_I19(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18
#define _ZS2_ATTACH_PREFIX_I20(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19
#define _ZS2_ATTACH_PREFIX_I21(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20
#define _ZS2_ATTACH_PREFIX_I22(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21
#define _ZS2_ATTACH_PREFIX_I23(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22
#define _ZS2_ATTACH_PREFIX_I24(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23
#define _ZS2_ATTACH_PREFIX_I25(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24
#define _ZS2_ATTACH_PREFIX_I26(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25
#define _ZS2_ATTACH_PREFIX_I27(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26
#define _ZS2_ATTACH_PREFIX_I28(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27
#define _ZS2_ATTACH_PREFIX_I29(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28
#define _ZS2_ATTACH_PREFIX_I30(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29
#define _ZS2_ATTACH_PREFIX_I31(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30
#define _ZS2_ATTACH_PREFIX_I32(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31
#define _ZS2_ATTACH_PREFIX_I33(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32
#define _ZS2_ATTACH_PREFIX_I34(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33
#define _ZS2_ATTACH_PREFIX_I35(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34
#define _ZS2_ATTACH_PREFIX_I36(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35
#define _ZS2_ATTACH_PREFIX_I37(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36
#define _ZS2_ATTACH_PREFIX_I38(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37
#define _ZS2_ATTACH_PREFIX_I39(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38
#define _ZS2_ATTACH_PREFIX_I40(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39
#define _ZS2_ATTACH_PREFIX_I41(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40
#define _ZS2_ATTACH_PREFIX_I42(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41
#define _ZS2_ATTACH_PREFIX_I43(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42
#define _ZS2_ATTACH_PREFIX_I44(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43
#define _ZS2_ATTACH_PREFIX_I45(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44
#define _ZS2_ATTACH_PREFIX_I46(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45
#define _ZS2_ATTACH_PREFIX_I47(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46
#define _ZS2_ATTACH_PREFIX_I48(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47
#define _ZS2_ATTACH_PREFIX_I49(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48
#define _ZS2_ATTACH_PREFIX_I50(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49
#define _ZS2_ATTACH_PREFIX_I51(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50
#define _ZS2_ATTACH_PREFIX_I52(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51
#define _ZS2_ATTACH_PREFIX_I53(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52
#define _ZS2_ATTACH_PREFIX_I54(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53
#define _ZS2_ATTACH_PREFIX_I55(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53 PREFIX##_54
#define _ZS2_ATTACH_PREFIX_I56(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53 PREFIX##_54 PREFIX##_55
#define _ZS2_ATTACH_PREFIX_I57(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53 PREFIX##_54 PREFIX##_55 PREFIX##_56
#define _ZS2_ATTACH_PREFIX_I58(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53 PREFIX##_54 PREFIX##_55 PREFIX##_56 PREFIX##_57
#define _ZS2_ATTACH_PREFIX_I59(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53 PREFIX##_54 PREFIX##_55 PREFIX##_56 PREFIX##_57 PREFIX##_58
#define _ZS2_ATTACH_PREFIX_I60(PREFIX, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59)  PREFIX##_1 PREFIX##_2 PREFIX##_3 PREFIX##_4 PREFIX##_5 PREFIX##_6 PREFIX##_7 PREFIX##_8 PREFIX##_9 PREFIX##_10 PREFIX##_11 PREFIX##_12 PREFIX##_13 PREFIX##_14 PREFIX##_15 PREFIX##_16 PREFIX##_17 PREFIX##_18 PREFIX##_19 PREFIX##_20 PREFIX##_21 PREFIX##_22 PREFIX##_23 PREFIX##_24 PREFIX##_25 PREFIX##_26 PREFIX##_27 PREFIX##_28 PREFIX##_29 PREFIX##_30 PREFIX##_31 PREFIX##_32 PREFIX##_33 PREFIX##_34 PREFIX##_35 PREFIX##_36 PREFIX##_37 PREFIX##_38 PREFIX##_39 PREFIX##_40 PREFIX##_41 PREFIX##_42 PREFIX##_43 PREFIX##_44 PREFIX##_45 PREFIX##_46 PREFIX##_47 PREFIX##_48 PREFIX##_49 PREFIX##_50 PREFIX##_51 PREFIX##_52 PREFIX##_53 PREFIX##_54 PREFIX##_55 PREFIX##_56 PREFIX##_57 PREFIX##_58 PREFIX##_59
#define _ZS2_ATTACH_PREFIX(...) _ZS2_VFUNC2(_ZS2_ATTACH_PREFIX_I, __VA_ARGS__)
// clang-format on

/*
 * _ZS2_SELECTOR_INIT_ARGS gets a list of SUCCESSORs and creates an argument
 * list for the SELECTOR_Successors_init function. It maps custom defined
 * SUCCESSOR(S) to `ZL_GraphID S, ` and predefined SUCCESSOR(S,V) to nothing.
 */
#define _ZS2_ARG_SUCCESSOR_I2(S, V)
#define _ZS2_ARG_SUCCESSOR_I1(S) ZL_GraphID S,
#define _ZS2_ARG_SUCCESSOR(...) _ZS2_VFUNC(_ZS2_ARG_SUCCESSOR_I, __VA_ARGS__)
#define _ZS2_SELECTOR_INIT_ARGS(...) \
    _ZS2_TRIM_COMMA(_ZS2_ATTACH_PREFIX(_ZS2_ARG_, __VA_ARGS__))

/*
 * _ZS2_SELECTOR_INIT_SET gets a list of SUCCESSORs and creates code to
 * initialize a SELECTOR_Successors struct for a selector that has these
 * SUCCESSORs. It maps custom defined SUCCESSOR(S) to `.S = S,` and predefined
 * SUCCESSOR(S,V) to `.S = V,`.
 */
#define _ZS2_SET_SUCCESSOR_I2(S, V) .S = V,
#define _ZS2_SET_SUCCESSOR_I1(S) .S = S,
#define _ZS2_SET_SUCCESSOR(...) _ZS2_VFUNC(_ZS2_SET_SUCCESSOR_I, __VA_ARGS__)
#define _ZS2_SELECTOR_INIT_SET(...) _ZS2_ATTACH_PREFIX(_ZS2_SET_, __VA_ARGS__)

/*
 * _ZS2_SELECTOR_STRUCT_DEFINITION gets a list of SUCCESSORs and creates
 * a SELECTOR_Successors structure for a selector that has these
 * SUCCESSORs. It maps SUCCESSOR(S, [V]) to `ZL_GraphID S;`.
 */
#define _ZS2_STRUCT_DEF_SUCCESSOR_I1(_1) ZL_GraphID _1;
#define _ZS2_STRUCT_DEF_SUCCESSOR_I2(_1, _2) ZL_GraphID _1;
#define _ZS2_STRUCT_DEF_SUCCESSOR(...) \
    _ZS2_VFUNC(_ZS2_STRUCT_DEF_SUCCESSOR_I, __VA_ARGS__)
#define _ZS2_SELECTOR_STRUCT_DEFINITION(...) \
    _ZS2_ATTACH_PREFIX(_ZS2_STRUCT_DEF_, __VA_ARGS__)

#endif // ZSTRONG_ZS2_SELECTOR_DECLARE_HELPER_MACRO_UTILS_H
